package realQuestion.huolala;

import java.util.LinkedList;
import java.util.Random;

//public class PCTest {
//
//    public  volatile LinkedList<String>  cache;
//    public  int capacity;
//    PCTest pc1;
//    PCTest pc2;
//    class  Producer{
//
//        public  void  produce(){
//            if (cache.size()==capacity){
//                try {
//                    pc1.wait();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }else {
//                cache.add("aaa");
//                System.out.println("已生产"+cache.size());
//                pc2.notify();
//            }
//        }
//    }
//
//    class  Consumer{
//        public  void  consume(){
//            if (cache.size()==0){
//                try {
//                    pc2.wait();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }else {
//                cache.removeFirst();
//                System.out.println("目前还有"+cache.size());
//                pc1.notify();
//            }
//        }
//
//    }
//
//    public PCTest(){
//
//    }
//
//    public   PCTest(int capacity){
//        this.cache=new LinkedList<>();
//        this.capacity=capacity;
//        pc1=new PCTest();
//        pc2=new PCTest();
//    }
//
//    public static void main(String[] args) {
//        PCTest pcTest = new PCTest(5);
//        Producer producer = pcTest.new Producer();
//        new  Thread(()->{
//            while (true){
//                producer.produce();
//            }
//        }).start();
//
//        Consumer consumer = pcTest.new Consumer();
//        new  Thread(()->{
//            while (true){
//              consumer.consume();
//            }
//        }).start();
//
//
//
//
//    }
//
//
//}

import java.util.LinkedList;
import java.util.Random;
import java.util.LinkedList;

public class PCTest {
    private final LinkedList<String> cache;
    private final int capacity;
    private final Object lock;
    private boolean isProducing;

    public PCTest(int capacity) {
        this.cache = new LinkedList<>();
        this.capacity = capacity;
        this.lock = new Object();
        this.isProducing = true;
    }

    class Producer {
        public void produce() {
            synchronized (lock) {
                while (cache.size() == capacity) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                cache.add("aaa");
                System.out.println("已生产" + cache.size());
                lock.notify();
            }
        }
    }

    class Consumer {
        public void consume() {
            synchronized (lock) {
                while (cache.size() == 0 && isProducing) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (cache.size() > 0) {
                    cache.removeFirst();
                    System.out.println("目前还有" + cache.size());
                    lock.notify();
                }
            }
        }
    }

    public static void main(String[] args) {
        PCTest pcTest = new PCTest(5);
        Producer producer = pcTest.new Producer();
        new Thread(() -> {
            while (pcTest.isProducing) {
                producer.produce();
            }
        }).start();

        Consumer consumer = pcTest.new Consumer();
        new Thread(() -> {
            while (true) {
                consumer.consume();
            }
        }).start();
    }
}
